﻿Imports System.Data.SqlClient
Imports extranet.BE
Imports MySql.Data.MySqlClient

Public Class DAGrupoAcesso
  Dim objBD As New BancoDeDados
  Public objQuery As New BEQuery

  Sub New()
  End Sub

  Sub New(ByVal booCondicaoSimilar As Boolean)
    objQuery.Where.CondicaoSimilar = booCondicaoSimilar
  End Sub

  Public Sub Cadastra(ByRef objBEGrupoAcesso As BEGrupoAcesso)
    Try
      objBD.duplicaAspasSimples(objBEGrupoAcesso, GetType(BEGrupoAcesso))
      Dim strSQL = "INSERT INTO ext_grupo_acesso (grupo, descricao) " & _
                   "VALUES ('" & objBEGrupoAcesso.Nome & "', '" & _
                                 objBEGrupoAcesso.Descricao & "');" & _
                   "SELECT LAST_INSERT_ID();"
      objBD.InicializarConexao()
      objBD.InicializarTransacao()
      Try
        Dim objComando As New MySqlCommand(strSQL, BancoDeDados.ConnectionInstance, BancoDeDados.TransactionInstance)
        objBEGrupoAcesso.IdGrupo = objComando.ExecuteScalar()

        relacionaTelas(objBEGrupoAcesso)
        relacionaUsuarios(objBEGrupoAcesso)

        objBD.Commit()
      Catch ex As ApplicationException
        objBD.Rollback()
        Throw New ApplicationException("Erro ao executar o comando: " & ex.Message)
      Finally
        objBD.FinalizarConexao()
      End Try
    Catch ex As ApplicationException
      Throw New ApplicationException("extranet.DA.DAGrupoAcesso.Cadastra(): " & ex.Message)
    End Try
  End Sub

  Public Sub Atualiza(ByVal objBEGrupoAcesso As BEGrupoAcesso)
    Try
      objBD.duplicaAspasSimples(objBEGrupoAcesso, GetType(BEGrupoAcesso))
      Dim strSQL = "UPDATE ext_grupo_acesso " & _
                   "SET grupo='" & objBEGrupoAcesso.Nome & "', " & _
                   "    descricao='" & objBEGrupoAcesso.Descricao & "' " & _
                   "WHERE id_grupo=" & objBEGrupoAcesso.IdGrupo & ";"
      objBD.InicializarConexao()
      objBD.InicializarTransacao()
      Try
        Dim objComando As New MySqlCommand(strSQL, BancoDeDados.ConnectionInstance, BancoDeDados.TransactionInstance)
        objComando.ExecuteNonQuery()

        relacionaTelas(objBEGrupoAcesso)
        relacionaUsuarios(objBEGrupoAcesso)

        objBD.Commit()
      Catch ex As ApplicationException
        objBD.Rollback()
        Throw New ApplicationException("Erro ao executar o comando: " & ex.Message)
      Finally
        objBD.FinalizarConexao()
      End Try
    Catch ex As ApplicationException
      Throw New ApplicationException("extranet.DA.DAGrupoAcesso.Atualiza(): " & ex.Message)
    End Try
  End Sub

  Private Sub relacionaTelas(ByVal objBEGrupoAcesso As BEGrupoAcesso)
    Dim strSQL As String = "DELETE FROM ext_grupo_acesso_telas_sistema WHERE id_grupo=" & objBEGrupoAcesso.IdGrupo & ";"
    Try
      For Each tela As BETela In objBEGrupoAcesso.Telas
        strSQL &= "INSERT INTO ext_grupo_acesso_telas_sistema " & _
                  "(id_grupo, id_tela, leitura, escrita, modificacao, exclusao) VALUES (" & _
                  objBEGrupoAcesso.IdGrupo & ", " & tela.IdTela & ", " & IIf(tela.Leitura, "1", "0") & ", " & _
                  IIf(tela.Escrita, "1", "0") & ", " & IIf(tela.Modificacao, "1", "0") & ", " & _
                  IIf(tela.Exclusao, "1", "0") & ");"
      Next
      Dim objComando As New MySqlCommand(strSQL, BancoDeDados.ConnectionInstance, BancoDeDados.TransactionInstance)
      objComando.ExecuteNonQuery()
    Catch ex As ApplicationException
      Throw New ApplicationException("Erro ao executar o relacionamento de Telas: " & ex.Message)
    End Try
  End Sub

  Private Sub relacionaUsuarios(ByVal objBEGrupoAcesso As BEGrupoAcesso)
    Dim strSQL As String
    strSQL = "UPDATE ext_usuario SET id_grupo_acesso=NULL WHERE id_grupo_acesso=" & objBEGrupoAcesso.IdGrupo & ";" & _
             "UPDATE ext_usuario SET id_grupo_acesso=" & objBEGrupoAcesso.IdGrupo & " WHERE usuario IN ('"
    Try
      For Each usuario As BEUsuario In objBEGrupoAcesso.Usuarios
        strSQL &= usuario.Usuario & "', '"
      Next
      strSQL &= "KLMADSKADSK');"
      Dim objComando As New MySqlCommand(strSQL, BancoDeDados.ConnectionInstance, BancoDeDados.TransactionInstance)
      objComando.ExecuteNonQuery()
    Catch ex As ApplicationException
      Throw New ApplicationException("Erro ao executar o relacionamento de Usuarios: " & ex.Message)
    End Try
  End Sub

  Public Sub Exclui(ByVal objBEGrupoAcesso As BEGrupoAcesso)
    Try
      objBD.ExecutaNonQuery("UPDATE ext_usuario SET id_grupo_acesso=NULL WHERE id_grupo_acesso=" & objBEGrupoAcesso.IdGrupo & ";" & _
                            "DELETE FROM ext_grupo_acesso_telas_sistema WHERE id_grupo='" & objBEGrupoAcesso.IdGrupo & "';" & _
                            "DELETE FROM ext_grupo_acesso WHERE id_grupo='" & objBEGrupoAcesso.IdGrupo & "';")
    Catch ex As ApplicationException
      Throw New ApplicationException("extranet.DA.DAGrupoAcesso.Exclui(): " & ex.Message)
    End Try
  End Sub

  Public Function Seleciona(ByVal objBEGrupoAcesso As BEGrupoAcesso) As List(Of BEGrupoAcesso)
    Dim objBEGruposAcesso As List(Of BEGrupoAcesso) = New List(Of BEGrupoAcesso)
    Try
      objBD.duplicaAspasSimples(objBEGrupoAcesso, GetType(BEGrupoAcesso))
      objQuery._Select = "SELECT * FROM ext_grupo_acesso"
      If objBEGrupoAcesso IsNot Nothing Then
        If objBEGrupoAcesso.IdGrupo > 0 Then objQuery.Where.AdicionarCondicaoWhere("id_grupo", objBEGrupoAcesso.IdGrupo, False)
        objQuery.Where.AdicionarCondicaoWhere("grupo", objBEGrupoAcesso.Nome)
        objQuery.Where.AdicionarCondicaoWhere("descricao", objBEGrupoAcesso.Descricao)
      End If
      objBEGruposAcesso = SelecionaGruposAcesso()
    Catch ex As ApplicationException
      Throw New ApplicationException("extranet.DA.DAGrupoAcesso.Seleciona(): " & ex.Message)
    End Try
    Return objBEGruposAcesso
  End Function

  Public Function SelecionaPeloUsuario(ByVal strUsuario As String) As BEGrupoAcesso
    Dim objBEGrupoAcesso As New BEGrupoAcesso
    Try
      If strUsuario IsNot Nothing Then
        objQuery._Select = "SELECT ga.* FROM ext_grupo_acesso ga " & _
                           "INNER JOIN ext_usuario u ON u.id_grupo_acesso=ga.id_grupo " & _
                           "WHERE u.usuario='" & objBD.duplicaAspasSimples(strUsuario) & "'"
        Dim objBEGruposAcesso As List(Of BEGrupoAcesso) = SelecionaGruposAcesso()
        If objBEGruposAcesso.Count > 0 Then objBEGrupoAcesso = objBEGruposAcesso(0)
      End If
    Catch ex As ApplicationException
      Throw New ApplicationException("extranet.DA.DAGrupoAcesso.SelecionaPeloUsuario(): " & ex.Message)
    End Try
    Return objBEGrupoAcesso
  End Function

  Public Function SelecionaPelaTela(ByVal intIdTela As String) As List(Of BEGrupoAcesso)
    Dim objBEGruposAcesso As List(Of BEGrupoAcesso) = New List(Of BEGrupoAcesso)
    Try
      objQuery._Select = "SELECT * FROM ext_grupo_acesso " & _
                         "WHERE id_grupo IN (SELECT id_grupo FROM ext_grupo_acesso_telas_sistema " & _
                                            "WHERE id_tela='" & intIdTela & "')"
      objBEGruposAcesso = SelecionaGruposAcesso()
    Catch ex As ApplicationException
      Throw New ApplicationException("extranet.DA.DAGrupoAcesso.SelecionaPeloUsuario(): " & ex.Message)
    End Try
    Return objBEGruposAcesso
  End Function

  Private Function SelecionaGruposAcesso() As List(Of BEGrupoAcesso)
    Dim objBEGruposAcesso As List(Of BEGrupoAcesso) = New List(Of BEGrupoAcesso)
    Try
      Using objSQLCommand As MySqlCommand = New MySqlCommand(objQuery.Query, BancoDeDados.ConnectionInstance())
        Using objSQLDReader As MySqlDataReader = objSQLCommand.ExecuteReader()
          While objSQLDReader.Read()
            objBEGruposAcesso.Add(New BEGrupoAcesso(objSQLDReader("id_grupo"), _
                                                    objSQLDReader("grupo").ToString(), _
                                                    objSQLDReader("descricao").ToString()))
          End While
        End Using
      End Using
    Catch ex As ApplicationException
      Throw New ApplicationException("extranet.DA.DAGrupoAcesso.SelecionaGruposAcesso(): " & ex.Message)
    End Try
    Return objBEGruposAcesso
  End Function

  Public Sub SelecionaPermissoes(ByRef objBEGrupoAcesso As BEGrupoAcesso, ByVal intIdTela As Integer)
    Dim consultaSql As String = ""
    Try
      consultaSql = "SELECT * FROM ext_grupo_acesso_telas_sistema " & _
                    "WHERE id_grupo='" & objBEGrupoAcesso.IdGrupo & "' AND id_tela='" & intIdTela & "'"
      Using command As New MySqlCommand(consultaSql, BancoDeDados.ConnectionInstance())
        Using reader As MySqlDataReader = command.ExecuteReader()
          While reader.Read()
            objBEGrupoAcesso.Leitura = reader("leitura")
            objBEGrupoAcesso.Escrita = reader("escrita")
            objBEGrupoAcesso.Modificacao = reader("modificacao")
            objBEGrupoAcesso.Exclusao = reader("exclusao")
          End While
        End Using
      End Using
    Catch ex As ApplicationException
      Throw New ApplicationException("extranet.DA.DAGrupoAcesso.SelecionaPermissoes(): " & ex.Message)
    End Try
  End Sub

End Class
